// 默认请求头
const headerDefault = {
    "Content-Type": "application/json",
    "Accept": "*/*"
}

// 请求头设置
const header = {}

/**
 * 发送http请求
 * @param {String} mode 请求模式
 * @param {String} url 请求地址
 * @param {String} body 请求体
 * @return {Promise}
 */
function http(mode, url, body = null) {
    return new Promise((resolve, reject) => {
        let http = xmlHttp();
        if (http != null) {
            http.onreadystatechange = function () {
                if (http.readyState == 4) {
                    if (http.status == 200) {
                        let res;
                        try {
                            res = JSON.parse(http.response)
                        } catch (err) {
                            res = http.response
                        } finally {
                            resolve(res);
                        }
                    } else {
                        reject(http.response);
                        console.error("Problem retrieving XML data");
                    }
                }
            }
            http.open(mode, url, true);
            // 添加头部
            for (const key in { ...headerDefault, ...header }) {
                http.setRequestHeader(key, headerDefault[key] || header[key]);
                delete header[key];
            };
            // 发送请求
            http.send(body);
        } else {
            // 浏览器不支持xmlHttp
            reject("浏览器不支持xmlHttp");
            console.error("Your browser does not support xmlHttp.");
        }
    })

    function xmlHttp() {
        let http = null;
        // 新浏览器
        if (window.XMLHttpRequest) http = new XMLHttpRequest();
        // IE5、IE6
        else if (window.ActiveXObject) http = new ActiveXObject("Microsoft.XMLHTTP");
        return http
    }
}

/**
 * post请求
 * @param {String} url 请求地址
 * @param {JSON} data 请求体
 * @return {Promise}
 */
function post(url, data) {
    const body = JSON.stringify(data)
    return http('POST', url, body)
}

/**
 * get请求
 * @param {String} url 请求地址
 * @param {JSON} param 请求参数
 */
function get(url, param) {
    if (param) {
        let p = [];
        for (let key in param) param[key] && p.push(`${key}=${param[key]}`);
        url = p.length ? url + '?' + p.join('&') : url;
    }
    return http('GET', url)
}

/**
 * 返回调用方法
 */
export default { post, get }